package com.javaweb.db.query;

import java.util.ArrayList;
import java.util.List;

import com.javaweb.db.help.SqlColumnFunction;
import com.javaweb.db.help.SqlCondition;
import com.javaweb.db.help.SqlHelpUtil;
import com.javaweb.enums.SqlConditionEnum;
import com.javaweb.util.core.PageUtil;

/**
 * 查询适配
 * @author tank2140896
 * @param QueryWapper<T> 查询条件封装
 */
public class QueryWapper<T> {
	
	/**
	 * 当前页数
	 */
	private long currentPage = PageUtil.DEFAULT_CURRENT_PAGE;
	
	/**
	 * 每页显示多少条
	 */
	private long pageSize = PageUtil.DEFAULT_PAGE_SIZE;
	
	/**
	 * 是否需要分页
	 */
	private boolean needPaged = PageUtil.DEFAULT_NEED_PAGE;
	
	/**
	 * sql条件列表
	 */
	private List<SqlCondition> sqlConditionList = new ArrayList<>();
	
	/**
	 * 获取sql条件列表
	 * @return List<SqlCondition> sql条件列表
	 */
	public List<SqlCondition> getSqlConditionList() {
		return sqlConditionList;
	}
	
	/**
	 * 清除所有适配条件
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> clear() {
		this.currentPage = PageUtil.DEFAULT_CURRENT_PAGE;
		this.pageSize = PageUtil.DEFAULT_PAGE_SIZE;
		this.needPaged = PageUtil.DEFAULT_NEED_PAGE;
		this.sqlConditionList.clear();
		return this;
	}
	
	/**
	 * 分页
	 * @param currentPage 当前页
	 * @param pageSize 每页显示条数
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> page(long currentPage,long pageSize){
		this.currentPage = currentPage;
		this.pageSize = pageSize;
		this.needPaged = true;
		return this;
	}
	
	/**
	 * 获取当前页数
	 * @return long 当前页数
	 */
	public long getCurrentPage() {
		return currentPage;
	}

	/**
	 * 获取每页显示条数
	 * @return long 每页显示条数
	 */
	public long getPageSize() {
		return pageSize;
	}
	
	/**
	 * 获取是否分页
	 * @return boolean 是否分页
	 */
	public boolean getNeedPaged() {
		return needPaged;
	}
	
	/**
	 * 相等的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> eq(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.EQ,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 不相等的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> neq(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.NEQ,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 模糊匹配的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> like(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.LIKE,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 小于的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> lt(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.LT,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 小于等于的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> le(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.LE,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 大于的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> gt(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.GT,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
	/**
	 * 大于等于的条件
	 * @param lambda 字段名称
	 * @param columnValue 字段值
	 * @return QueryWapper<T> 适配条件
	 */
	public QueryWapper<T> ge(/*String columnName*/SqlColumnFunction<T> lambda,Object columnValue){
		sqlConditionList.add(new SqlCondition(SqlConditionEnum.GE,/*columnName*/SqlHelpUtil.getColumnName(lambda),columnValue));
		return this;
	}
	
}
